/*
 * 汇编语言访问存储器
 * 1.读存储器
 * 		LDR R1, [R2]
 * 2.写存储器
 * 		STR R1, [R2]
 *
 * C语言访问存储器
 * 1.读存储器
 * 		data = *ADDR
 * 2.写存储器
 * 		*ADDR = data
 * */

/*这种写法可读性和安全性都不高*/

#if 0
void Delay(unsigned int Time){
	while(Time--);
}

int main(){
	/*通过设置GPIXCON寄存器 output模式 控制 GPIX2_7引脚*/
	*(unsigned int *)0x11000C40 = 0x10000000; // 强制类型转换，告诉编译器这是地址。
	while(1){
	/*通过设置GPIXDAT寄存器 控制LED2的亮*/
	*(unsigned int *)0x11000C44 = 0x00000080;
	/*设置延迟函数*/
	Delay(1000000);
	/*通过设置GPIXDAT寄存器 控制LED2的灭*/
	*(unsigned int *)0x11000C44 = 0x00000000;
	/*设置延迟函数*/
	Delay(1000000);
	}
	return 0;
}
#endif

#if 0
#define GPIX2CON (*(unsigned int *)0x11000C40)
#define GPIX2DAT (*(unsigned int *)0x11000C44)

void Delay(unsigned int Time){
	while(Time--);
}
int main(){
	GPIX2CON = 0x10000000;
	while(1){
		GPIX2DAT = 0x00000080;
		Delay(1000000);
		GPIX2DAT = 0x00000000;
		Delay(1000000);
	}
	return 0;
}
#endif

/*typedef struct{
	unsigned int CON;
	unsigned int DAT;
	unsigned int PUD;
	unsigned int DRV;
}gpx2;
*/

#include "exynos_4412.h"

#define GPX2 (*(gpx2*)0x11000C40)

void Delay(unsigned int Time){
	while(Time--);
}

int main(){

//GPX2.CON = 0x10000000;
	GPX2.CON = GPX2.CON & (~(0xF) << 28) | (0x1 << 28);
	while(1){
	//GPX2.DAT = 0x00000080;
		GPX2.DAT = GPX2.DAT | (1 << 7); 
		Delay(1000000);
	//GPX2.DAT = 0x00000000;
		GPIX.DAT = GPX2.DAT & (~(1 << 7));
		Delay(1000000);
	}

	return 0;
}

/* unsigned int a;
 *
 * 1.或运算 “|” （若只需要改变一位数）
 * 0/1 或1 则为1, 或0 则为它本身
 * ******** ******** ******** ********
 * ******** ******** ******** *1******
 * 00000000 00000000 00000000 01000000
 * a = a | (1 << 7);
 * 
 * 2.与运算 “&” （若只需要改变一位数）
 * 0/1 与0则为0，与1 则为它本身
 * ******** ******** ******** ********
 * ******** ******** ******** *0******
 * 11111111 11111111 11111111 10111111
 * 00000000 00000000 00000000 01000000
 * a = a & (~(1 << 7));
 *
 * 3. 或运算 和 与运算 的结合 （当寄存器需要多位数来控制时，需要改变多位数）
 *
 * 	1) 相关位数 “&” 清0
 * 	2) 相关位数 “|” 置1 
 * ******** ******** ******** ********
 * ******** ******** ******** 1010****
 *
*1.11111111 11111111 11111111 00001111
*  00000000 00000000 00000000 11110000
*  00000000 00000000 00000000 00001111
*
*  a = a & (~(0xF) << 4);
*
*2.00000000 00000000 00000000 10100000
 * 00000000 00000000 00000000 00001010
 * a = a | (0xa << 4);
 *
 * 1 + 2 ==>
 * 		a = a & (~(0xF) << 4) | (0xa << 4);
 *
 */



